      1  import java.io.InputStream;

      2  import java.io.IOException;

      3  import java.io.OutputStream;

      4  import java.io.PrintWriter;

      5  import java.net.Socket;

      6  import java.util.Scanner;

      7

      8  /**

      9     Executes Simple Bank Access Protocol commands

     10     from a socket.

     11  */

     12  public class BankService implements Runnable

     13  {

     14     private Socket s;

     15     private Scanner in;

     16     private PrintWriter out;

     17     private Bank bank;

     18

     19     /**

     20        Constructs a service object that processes commands

     21        from a socket for a bank.

     22        @param aSocket the socket

     23        @param aBank the bank

     24     */

     25     public BankService(Socket aSocket, Bank aBank)

     26     {

     27        s = aSocket;

     28        bank = aBank;

     29     }

     30

     31     public void run()

     32     {

     33        try

     34        {

     35           try

     36           {

     37              in = new Scanner(s.getInputStream());

     38              out = new PrintWriter(s.getOutputStream());

     39              doService();

     40           }

     41           finally

     42           {

     43              s.close();

     44           }

     45        }

     46        catch (IOException exception)

     47        {

     48           exception.printStackTrace();

     49        }

     50     }

     51

     52     /**

     53        Executes all commands until the QUIT command or the

     54        end of input.

     55     */

     56     public void doService() throws IOException

     57     {

     58        while (true)

     59        {

     60           if (!in.hasNext()) { return; }

     61           String command = in.next();

     62           if (command.equals("QUIT")) { return; }

     63           else executeCommand(command);

     64        }

     65     }

     66

     67     /**

     68        Executes a single command.

     69        @param command the command to execute

     70     */

     71     public void executeCommand(String command)

     72     {

     73        int account = in.nextInt();

     74        if (command.equals("DEPOSIT"))

     75        {

     76           double amount = in.nextDouble();

     77           bank.deposit(account, amount);

     78        }

     79        else if (command.equals("WITHDRAW"))

     80        {

     81           double amount = in.nextDouble();

     82           bank.withdraw(account, amount);

     83        }

     84        else if (!command.equals("BALANCE"))

     85        {

     86           out.println("Invalid command");

     87           out.flush();

     88           return;

     89        }

     90        out.println(account + " " + bank.getBalance(account));

     91        out.flush();

     92     }

     93  }